package com.nio;

import org.junit.Test;

import java.nio.ByteBuffer;

/**
 * 缓冲区
 *
 * 1.作用，用来存取数据，类似一个数组。
 *
 * 2.常用的缓冲类型（除了 boolean），所有基本类型--> 创建直接调用allocate
 *
 * ByteBuffer
 * CharBuffer  ...
 *
 * 3.存取方式操作
 * put()
 * get()
 * flip() -->切换数据的读取模式
 *
 * 4.常用的内置参数，属性
 * capacity  容量
 * limit  当前大小
 * position 位置
 * mark 标记, 一个位置的标记 (会输出容量,当前大小,和位置)
 *
 * 5. 直接缓冲区 和 非直接缓冲区
 *
 * 非直接缓冲区: 通过allocate() 方法分配缓冲区, 将内存分配到JVM内存中 --> 再传到机器的内存中.
 * 直接缓冲区: 通过allocateDirect() 方法分配缓冲区, 将缓冲区建立在"物理内存中", 提高效率(这个区域被称为物理内存映射文件)
 *
 * 6.通道(channel)
 * 完全独立的处理器, 专门处理IO操作, 替代CPU的处理
 *
 * @author Administrator
 */
public class TestBuffer {

    @Test
    public void testBuffers(){

        String name = "laocao";

        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

        for (int i = 0; i < 5; i ++){
            byteBuffer.put((byte) i);
        }
        byteBuffer.put(name.getBytes());

        System.out.println(byteBuffer.capacity());
        System.out.println(byteBuffer.limit());
        //byteBuffer.clear();
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.mark());
    }

    @Test
    public void test02(){

        //建立直接缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);

        //判断是不是直接缓冲区
        System.out.println(byteBuffer.isDirect());
    }

}
